// Copyright (C) 2016 Michael Ficarra. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: >
    Ensure that the regular expression generally distinguishes between valid
    and invalid forms of the NativeFunction grammar production.
includes: [nativeFunctionMatcher.js]
---*/

function Test() {
    [
      'function(){[native code]}',
      'function(){ [native code] }',
      'function ( ) { [ native code ] }',
      'function a(){ [native code] }',
      'function a(){ /* } */ [native code] }',
      `function a() {
        // test
        [native code]
        /* test */
      }`,
      'function(a, b = function() { []; }) { [native code] }',
      'function [Symbol.xyz]() { [native code] }',
      'function [x[y][z[d]()]]() { [native code] }',
      'function ["]"] () { [native code] }',
      'function [\']\'] () { [native code] }',
      '/* test */ function() { [native code] }',
      'function() { [native code] } /* test */',
      'function() { [native code] } // test',
    ].forEach((s) => {
      try {
        validateNativeFunctionSource(s);
      } catch (unused) {
        throw new Error(`${JSON.stringify(s)} should pass`);
      }
    });

    [
      'native code',
      'function() {}',
      'function(){ "native code" }',
      'function(){ [] native code }',
      'function()) { [native code] }',
      'function(() { [native code] }',
      'function []] () { [native code] }',
      'function [[] () { [native code] }',
      'function ["]] () { [native code] }',
      'function [\']] () { [native code] }',
      'function() { [native code] /* }',
      '// function() { [native code] }',
    ].forEach((s) => {
      let fail = false;
      try {
        validateNativeFunctionSource(s);
        fail = true;
      } catch (unused) {}
      if (fail) {
        throw new Error(`${JSON.stringify(s)} should fail`);
      }
    });
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_TEST; i++) {
    Test();
}
